package com.mmall.common;

import com.google.common.cache.CacheBuilder;
import com.google.common.cache.CacheLoader;
import com.google.common.cache.LoadingCache;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.concurrent.TimeUnit;

/**
 * Created by xinxuchu on 2018/11/5.
 */
public class TokenCache {

    //这块下来研究一下，关于工厂模式和反射的相关问题
    private static Logger logger = LoggerFactory.getLogger(TokenCache.class);

    public static final String TOKEN_PREFIX = "token_";

    //这里使用Guava本地缓存，
    private static LoadingCache<String,String> loadingCache = CacheBuilder.newBuilder()
            .initialCapacity(1000)//设置缓存的初始化容量
            .maximumSize(10000)//设置缓存的最大容量，当guava缓存超过这个容量的时候，采用LRU算法
            .expireAfterAccess(12, TimeUnit.HOURS)//这个缓存的有效期是12个消失
            .build(new CacheLoader<String, String>() {
                //默认数据加载，调用get取值的时候，若没有key的值，就调用这个方法进行加载。
                @Override
                public String load(String s) throws Exception {
                    return "null";//当没有缓存的时，返回null容易报空指针异常，只能返回一个字符串的null；
                }
            });

    public static void setKey(String key,String value){
        loadingCache.put(key,value);
    }

    public static String getKey(String key) {

        String value = null;
        try {
            value = loadingCache.get(key);
            if ("null".equals(value)) {
                return null;
            }
            return value;
        } catch (Exception e) {
            logger.error("localCache get error!", e);
        }
        return null;
    }
}